home *** CD-ROM | disk | FTP | other *** search
/ PC-SIG: World of Games / PC-SIG World of Games (CDRM1080710) (1993).iso / ENT / DISK2468.ZIP / MM / MM.C next >
Text File  |  1990-05-23  |  53KB  |  1,746 lines

  1. /* Mastermind, Mini Mastermind & Advanced Mastermind */
  2.  
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <time.h>
  6. #include <dos.h>
  7. #include <conio.h>
  8. #include <ctype.h>
  9. #include "\tc\myincs\mouse.h"        /* mouse routines */
  10. #include "\tc\myincs\myscreen.h" /* cursor & border control routines */
  11. #include "\tc\myincs\popup.h"        /* popup menu routines */
  12.  
  13. #define    TRUE            1
  14. #define    FALSE            0
  15. #define    RTN        0x0d
  16. #define    ESC        0x1b
  17. #define    F1              59
  18. #define    NUL        0x00
  19. #define    LEFT            0
  20. #define    RIGHT            1
  21.  
  22. char    ch, InKey;
  23. int    FunctionKey;
  24. int    RestartFlag;
  25. int    Help;
  26. int    Done;
  27. int    mode; /* 0:Mastermind; 1:Mini Mastermind; 2:Advanced Mastermind */
  28. int    MaxTurns;    /* is dependent upon mode */
  29. int    GoForever;
  30. int    Forever;
  31. int    LeftButton;
  32. int    RightButton;
  33. int    ShowMainMenu;
  34. int    HasCheated = FALSE;
  35. int    UseKbd = FALSE;
  36. int    MousePresent = FALSE;
  37. int    PegPosition;  /* for keyboard use */
  38. int    PegNumber = 0;
  39. int    PegAnswer[5];
  40. int    PegGuess[5];
  41. int    Turn = 1;
  42. int    UWin,ULose;
  43. int    MissedBox = FALSE;
  44. int    MouseValid;
  45. int    i;
  46. int    NumPegs;    /* mode = 0 or 1 -> 6 or 7; mode = 2 -> 8 or 9 */
  47. int    BlackNum;
  48. int    WhiteNum;
  49. int    Loop, CheatToggle, SoundToggle;
  50. int    HelpOn = TRUE;
  51. int    GraphDriver, GraphMode, ErrorCode;
  52. int    PegCoords[4] = {6 , 2 , 10 , 24};
  53. int    PutCoords[4] = {20 , 2 , 54 , 24};
  54. int    MakeGuessCoords[4] = {61, 1, 78, 1};
  55. int    OptionsCoords[4] = {2, 1, 13, 1};
  56. struct    text_info initial_info;
  57.  
  58. void    InitScreenSettings(void);
  59. void    ShareWareScreen(void);
  60. void    PrintDirections(void);
  61. int    HiliteMenuEntry(windesc *w, char *entry[], int min_entry,
  62.             int max_entry, int spacing);
  63. int    HiliteSettingsEntry(windesc *w, int init_entryno);
  64. void    InitializeMouse(void);
  65. int    NumberOfPegColors(int mode);
  66. void    DrawPeg(int mode, int pegnumber, int xloc, int yloc);
  67. void    DrawScreen(int mode);
  68. void    DrawScreenText(int mode);
  69. void    DrawBorder(void);
  70. void    DrawPegs(int mode);
  71. void    DrawGuessHoles(int turn, int mode);
  72. void    RemoveOldIndicator(int mode);
  73. void    DrawNewIndicator(int mode);
  74. void    Init(void);
  75. void    RunMasterMind(void);
  76. void    RandomPattern(int mode);
  77. int    GetPegType(int mode, char ch);
  78. void    SetPegPosition(int mode);
  79. void    ClearSetPeg(int mode);
  80. void    PutPegType(int mode);
  81. void    MakeGuess(int mode);
  82. void    GetBlackAndWhiteClues();
  83. void    YouWin(void);
  84. void    YouLose(void);
  85. void    GiveHelpInformation(int msg);
  86. void    SettingsMenu(void);
  87. void    GiveWinOrLoseStatus(int msg);
  88. void    Cheat(int mode);
  89. void    Instructions(int select);
  90. void    Quit(void);
  91. void    BeepHi(void);
  92. void    BeepLo(void);
  93.  
  94. void    ShareWareScreen(void)
  95. {
  96.     char *share_entries[] = {
  97.         "",
  98.         " This is a shareware program. You are free to test it, copy",
  99.         " it and distribute it.  If you expect to play it regularly,",
  100.         " please support my programming  efforts by registering your",
  101.         " copy.  To register, send your name, address, and $10 to me",
  102.         " at the address listed below. Your comments and suggestions",
  103.         " are also welcome.",
  104.         "",
  105.         " This program requires a color monitor.  It has been tested",
  106.         " on CGA, EGA and VGA systems.   Use of a mouse is optional.",
  107.         " A complete set of directions is included.",
  108.       "",
  109.         "          Dan Bartnik",
  110.         "          3776 Golden Hill Terrace",
  111.         "          Eagan, MN  55122",
  112.         "",
  113.         "        < press a key or mouse button to continue >",
  114. };
  115.     windesc *share_win;
  116.     int i;
  117.  
  118.     if (MousePresent) mouse_off(1);
  119.     clrscr();
  120.  
  121.     share_win = draw_win(CTRWIN,CTRWIN,62,18," MASTERMIND - Version 1.0 ",popup,&defcolors);
  122.     slct_win(share_win);
  123.  
  124.     for (i=1; i<=16; i++)
  125.         prtfstr(1,i,share_entries[i],share_win->wc.text_color,80);
  126.     do {} while(!kbhit() && !button_press(LEFT) && !button_press(RIGHT));
  127.     if (kbhit()) getch();
  128.  
  129.     if (MousePresent) mouse_on(1);
  130.     rmv_win(share_win);
  131. }
  132.  
  133. void    PrintDirections(void)
  134. {
  135.     char *menu1_entries[] = {
  136.         " Play Mastermind",
  137.         " Play Mini Mastermind",
  138.         " Play Advanced Mastermind",
  139.         " Instructions for Play",
  140.         " Return to DOS"
  141.     };
  142.  
  143.     windesc *w1;
  144.     int i, entryno, x, y;
  145.     /* unsigned int key; */
  146.  
  147.     Help = FALSE;
  148.     Done = FALSE;
  149.     ShowMainMenu = FALSE;    /* goes back to TRUE if directions are printed */
  150.     NumPegs = 6;
  151.     if (MousePresent) mouse_off(1);
  152.  
  153.     textattr(BLUE + (LIGHTGRAY<<4));
  154.  
  155.     clrscr();    /* check for "Play Game" or "Show Help" */
  156.  
  157.     w1 = draw_win(CTRWIN,CTRWIN,28,13," MASTERMIND - Ver 1.0 ",popup,&defcolors);
  158.     slct_win(w1);
  159.     for (i=1; i<=5; i++) {
  160.         prtfstr(1,2*i-1,"",w1->wc.text_color,80);
  161.         prtfstr(1,2*i,menu1_entries[i-1],w1->wc.text_color,80);
  162.     }
  163.  
  164.     entryno = HiliteMenuEntry(w1,menu1_entries,1,5,2);    /* get an entry */
  165.  
  166.     switch(entryno) {
  167.         case  1: mode = 0; MaxTurns = 10; break;        /* Mastermind */
  168.         case  2: mode = 1; MaxTurns = 6;  break;        /* Mini Mastermind */
  169.         case  3: mode = 2; MaxTurns = 12; break;        /* Adv Mastermind */
  170.         case  4: Help = TRUE; break;    /* Print Directions */
  171.         case  5: Done = TRUE; break;    /* Exit Program */
  172.     }
  173.     set_mouse_window(1,1,80,25);
  174.     rmv_win(w1);
  175.     clrscr();
  176.  
  177.     if (Done) Quit();
  178.  
  179.     if (Help)
  180.     {        /* PRINT FIRST PART OF DIRECTIONS */
  181.         ShowMainMenu = TRUE;    /* return to main menu after directions */
  182.         textattr(RED + (LIGHTGRAY<<4));
  183.         clrscr();
  184.         gotoxy(1,1);
  185.         cprintf("                       INSTRUCTIONS FOR MASTERMIND");
  186.       textattr(BLUE + (LIGHTGRAY<<4));
  187.         gotoxy(1,2);
  188.         cprintf("This game is similar  to the board game  Mastermind.  It is a great  exercise in");
  189.         gotoxy(1,3);
  190.         cprintf("logic.  The computer generates a secret code and you must try to  determine  the");
  191.         gotoxy(1,4);
  192.         cprintf("code through a series of guesses. After each guess you will be given clues which");
  193.         gotoxy(1,5);
  194.         cprintf("indicate how close your guess is to the secret code.  This game has an advantage");
  195.         gotoxy(1,6);
  196.         cprintf("over the  board game,  the  computer won't err in  presenting clues.  The secret");
  197.         gotoxy(1,7);
  198.         cprintf("code consists of four colored tiles; tiles can take on 6 (or possibly 7) colors.");
  199.         gotoxy(1,8);
  200.         cprintf("You may receive two types of clues, black and white :");
  201.         textattr(BLACK + (LIGHTGRAY<<4)); gotoxy(1,10);
  202.         cprintf("██ - one guess is of the correct color and in the correct location.");
  203.         textattr(WHITE + (LIGHTGRAY<<4)); gotoxy(1,12);
  204.         cprintf("██ - one guess is of the correct color but the location is incorrect.");
  205.       textattr(BLUE + (LIGHTGRAY<<4));
  206.         gotoxy(1,14);
  207.         cprintf("You win if you can determine all four parts of the secret code (this corresponds");
  208.         gotoxy(1,15);
  209.         cprintf("to getting four BLACK clues) in ten or less turns. When the game begins you will");
  210.         gotoxy(1,16);
  211.         cprintf("be given the option of having either 6 or 7 types of colored tiles in the secret");
  212.         gotoxy(1,17);
  213.         cprintf("code; six is for beginners.  You may play by using either a mouse, the keyboard,");
  214.         gotoxy(1,18);
  215.         cprintf("or a combination of the two.");
  216.         gotoxy(1,19);
  217.         cprintf("MOUSE :    Use the left button to play the game.  The right button brings a");
  218.         gotoxy(1,20);
  219.         cprintf("           popup settings menu.");
  220.         gotoxy(1,21);
  221.         cprintf("KEYBOARD : Use left & right arrow keys to move to a guess location.  Enter");
  222.         gotoxy(1,22);
  223.         cprintf("           the appropriate number to place a tile at that location.  The");
  224.         gotoxy(1,23);
  225.         cprintf("           F1 key brings a popup settings menu.");
  226.         textattr(RED + (LIGHTGRAY<<4));
  227.         gotoxy(10,25);
  228.         cprintf("< press a mouse button or key to see an example game board >");
  229.         textattr(WHITE + (LIGHTGRAY<<4));
  230.  
  231.         while ( !mouse_trigger(1) );
  232.  
  233.             /* PRINT SECOND PART OF DIRECTIONS */
  234.         clrscr();
  235.         DrawScreen(0);
  236.  
  237.             /* PRINT GUESS HOLES */
  238.         DrawPeg(0, 0, 20, 24);
  239.         DrawPeg(0, 0, 28, 24);
  240.         DrawPeg(0, 0, 36, 24);
  241.         DrawPeg(0, 0, 44, 24);
  242.  
  243.         textattr(RED + (LIGHTGRAY<<4));    /* draw indicators: guess 1 */
  244.         gotoxy(17,24); cprintf("▓");
  245.         gotoxy(49,24); cprintf("▓");
  246.  
  247.         Instructions(1);    /* print first popup window instructions */
  248.  
  249.             /* PRINT SAMPLE GUESSES */
  250.         DrawPeg(0, 4, 20, 24);
  251.         DrawPeg(0, 1, 28, 24);
  252.         DrawPeg(0, 1, 36, 24);
  253.         DrawPeg(0, 3, 44, 24);
  254.  
  255.             /* PRINT SAMPLE ANSWERS */
  256.         DrawPeg(0, 3, 20, 3);
  257.         DrawPeg(0, 4, 28, 3);
  258.         DrawPeg(0, 1, 36, 3);
  259.         DrawPeg(0, 4, 44, 3);
  260.  
  261.             /* PRINT SAMPLE CLUES */
  262.  
  263.         textattr(WHITE + (LIGHTGRAY<<4));
  264.         textbackground(BLACK);
  265.         gotoxy(63,24); cprintf("  ");
  266.  
  267.         textattr(WHITE + (LIGHTGRAY<<4));
  268.         gotoxy(66,24); cprintf("██");
  269.         gotoxy(69,24); cprintf("██");
  270.  
  271.         textattr(LIGHTGRAY + (LIGHTGRAY<<4));    /* remove indicators: guess 1 */
  272.         gotoxy(17,24); cprintf(" ");
  273.         gotoxy(49,24); cprintf(" ");
  274.         textattr(RED + (LIGHTGRAY<<4));    /* draw indicators: guess 2 */
  275.         gotoxy(17,22); cprintf("▓");
  276.         gotoxy(49,22); cprintf("▓");
  277.  
  278.         Instructions(2);    /* print final popup window instructions */
  279.  
  280. /*        textattr(MAGENTA + (LIGHTGRAY<<4) + BLINK);
  281.         gotoxy(18,25); cprintf(" PRESS MOUSE OR KEYBOARD FOR MAIN MENU ");
  282.  
  283.         textattr(WHITE + (LIGHTGRAY<<4));
  284.       do {} while(!kbhit() && !button_press(LEFT) && !button_press(RIGHT));
  285.         if (kbhit()) getch(); */
  286.         clrscr();
  287.     }
  288.     if (MousePresent) mouse_on(1);
  289. }
  290.  
  291. int HiliteMenuEntry(windesc *w, char *entry[],int min_entry,int max_entry,int spacing)
  292. /*    goes through a menu, hiliting the entries as either the mouse
  293.     or the cursor moves.  Returns the entry number presently selected
  294.     when RTN or MOUSE button is pressed. */
  295.  
  296. {
  297.     int x, y, newx, newy, oldy;
  298.     int entryno, Select = FALSE, ChangeMousePos;
  299.    unsigned int key;
  300.  
  301.    set_mouse_window(1,1,1,max_entry-min_entry+1);
  302.     move_mouse(1,0);
  303.     newy = oldy = 1; entryno = min_entry;
  304.  
  305.     do {                /* do this until key or mouse event */
  306.         /* hilite an entry */
  307.         prtfstr(1,entryno*spacing,"%-*.*s",w->wc.hilite_color,80,w->wd-2,w->wd-2,entry[entryno-1]);
  308.  
  309.         do {
  310.             ChangeMousePos = FALSE;
  311.             if (MousePresent) {
  312.                 mouse_txt_posn(&newx,&newy);
  313.                 if (newy != oldy) {
  314.                     ChangeMousePos = TRUE;
  315.                     oldy = newy;
  316.                 }
  317.             }
  318.         } while ( (!(key = mouse_trigger(1))) && !ChangeMousePos);
  319.  
  320.         /* back to normal */
  321.         prtfstr(1,entryno*spacing,"%-*.*s",w->wc.text_color,80,w->wd-2,w->wd-2,entry[entryno-1]);
  322.  
  323.         switch(key) {
  324.             case 0x0938:    /* 8 or up arrow */
  325.             case UPKEY:
  326.                 entryno = entryno - 1;
  327.                 if (entryno < min_entry) entryno = max_entry; /* wrap-around */
  328.                 break;
  329.             case 0x0332:    /* 2 or down arrow */
  330.             case DOWNKEY:
  331.                 entryno = entryno + 1;
  332.                 if (entryno > max_entry) entryno = min_entry; /* wrap-around */
  333.                 break;
  334.          case RIGHT_MOUSE_PRESS:
  335.             case LEFT_MOUSE_PRESS: /* break and execute appropriate routine */
  336.             case CRKEY:
  337.                 Select = TRUE;
  338.                 break;
  339.             default:            /* have hiliting track mouse position */
  340.                 if (ChangeMousePos) {
  341.                     mouse_txt_posn(&x,&y);
  342.                     entryno = y;
  343.                     break;
  344.                 }
  345.         }
  346.     } while (!Select);
  347.     return (entryno);
  348. }
  349.  
  350. int HiliteSettingsEntry(windesc *w, int init_entryno)
  351. /*    goes through a menu, hiliting the entries as either the mouse
  352.     or the cursor moves.  Returns the entry number presently selected
  353.     when RTN or MOUSE button is pressed. */
  354. {
  355.     int x, y, newx, newy, oldy;
  356.     int entryno, Select = FALSE, ChangeMousePos;
  357.    unsigned int key;
  358.     int min_entry = 1, max_entry = 8;
  359.     char    msg[30],msg1[30],msg2[30],msg3[30],msg4[30],
  360.             msg5[30],msg6[30],msg7[30],msg8[30];
  361.  
  362.     entryno = init_entryno;    /* first entry to be hilited */
  363.     newy = oldy = 1;
  364.  
  365.     set_mouse_window(1,1,min_entry,max_entry);
  366.     move_mouse(1,init_entryno-1);
  367.  
  368.     strcpy(msg1," Restart");
  369.     if (SoundToggle) strcpy(msg2," Sound is ON ");
  370.         else strcpy(msg2," Sound is OFF");
  371.     if (HelpOn) strcpy(msg3," Messages are ON ");
  372.         else strcpy(msg3," Messages are OFF");
  373.     strcpy(msg4," Cheat");
  374.     strcpy(msg5," Instructions");
  375.    strcpy(msg6," Return to Main Menu");
  376.     strcpy(msg7," Return to DOS");
  377.     strcpy(msg8," Exit Menu <ESC>");
  378.  
  379.     do {                /* do this until key or mouse event */
  380.         switch (entryno) {
  381.             case 1: for (i=0;i<30;i++) msg[i] = msg1[i]; break;
  382.             case 2: for (i=0;i<30;i++) msg[i] = msg2[i]; break;
  383.             case 3: for (i=0;i<30;i++) msg[i] = msg3[i]; break;
  384.             case 4: for (i=0;i<30;i++) msg[i] = msg4[i]; break;
  385.             case 5: for (i=0;i<30;i++) msg[i] = msg5[i]; break;
  386.             case 6: for (i=0;i<30;i++) msg[i] = msg6[i]; break;
  387.             case 7: for (i=0;i<30;i++) msg[i] = msg7[i]; break;
  388.             case 8: for (i=0;i<30;i++) msg[i] = msg8[i]; break;
  389.         }
  390.         /* hilite an entry */
  391.         prtfstr(1,entryno*2,"%-*.*s",w->wc.hilite_color,80,w->wd-2,w->wd-2,msg);
  392.  
  393.         do {
  394.             ChangeMousePos = FALSE;
  395.          if (MousePresent) {
  396.                 mouse_txt_posn(&newx,&newy);
  397.                 if (newy != oldy) {
  398.                     ChangeMousePos = TRUE;
  399.                     oldy = newy;
  400.                 }
  401.             }
  402.         } while ( (!(key = mouse_trigger(1))) && !ChangeMousePos);
  403.  
  404.         /* back to normal */
  405.         prtfstr(1,entryno*2,"%-*.*s",w->wc.text_color,80,w->wd-2,w->wd-2,msg);
  406.  
  407.         switch(key) {
  408.           case 0x0938:    /* 8 or up arrow */
  409.             case UPKEY:
  410.                 entryno = entryno - 1;
  411.                 if (entryno < min_entry) entryno = max_entry; /* wrap-around */
  412.                 break;
  413.          case 0x0332:    /* 2 or down arrow */
  414.             case DOWNKEY:
  415.                 entryno = entryno + 1;
  416.                 if (entryno > max_entry) entryno = min_entry; /* wrap-around */
  417.                 break;
  418.             case 0x011b:    /* ESC, remove menu */
  419.                 Select = TRUE;
  420.                 entryno = 8;
  421.                 break;
  422.          case RIGHT_MOUSE_PRESS:
  423.             case LEFT_MOUSE_PRESS: /* break and execute appropriate routine */
  424.             case CRKEY:
  425.                 Select = TRUE;
  426.                 move_mouse(1,entryno-1);    /* move mouse to entryno position */
  427.                 break;
  428.             default:        /* have hiliting track mouse position */
  429.              if (ChangeMousePos) {
  430.                     mouse_txt_posn(&x,&y);
  431.                     entryno = y;
  432.                     break;
  433.                 }
  434.         }
  435.     } while (!Select);
  436.     return (entryno);
  437. }
  438.  
  439. void    InitScreenSettings(void)
  440. {
  441.     delay(1);                /* call delay, it's not accurate 1st time */
  442.     gettextinfo(&initial_info);    /* save state of screen */
  443.     textmode(3);                        /* set to color 80 column mode */
  444.     TurnCursorOff();
  445.     TurnBorderOn(LIGHTGRAY);
  446.     textbackground(LIGHTGRAY);
  447. }
  448.  
  449. void    InitializeMouse(void)
  450. {
  451.     MousePresent = init_mouse(MOUSE_OPTIONAL, MOUSE_TEXT_MODE, MOUSE_TEXT_MODE);
  452.     move_mouse(40,12);    /* move mouse to middle of screen */
  453.     if (!MousePresent) UseKbd = TRUE;
  454. }
  455.  
  456. void    Init(void)
  457. {
  458.     CheatToggle = FALSE;
  459.     Turn = 1;
  460.     DrawScreen(mode);
  461.     if (UseKbd) { PegPosition = 1; SetPegPosition(mode); }
  462. }
  463.  
  464. int    NumberOfPegColors(int mode)
  465. {
  466.     char *menu2_entries[] = {
  467.         "6 Peg Types",
  468.         "7 Peg Types"
  469.     };
  470.     char *menu3_entries[] = {
  471.         "8 Peg Types",
  472.         "9 Peg Types",
  473.         "10 Peg Types",
  474.         "11 Peg Types"
  475.     };
  476.  
  477.     windesc *w2;
  478.     int i, entryno, x, y, Answer, count;
  479.     unsigned int key;
  480.  
  481.     Help = FALSE;
  482.     Done = FALSE;
  483.     NumPegs = 6;
  484.     if (MousePresent) mouse_off(1);
  485.  
  486.     switch (mode) {
  487.         case 0:
  488.             w2 = draw_win(CTRWIN,CTRWIN,28,7," MASTERMIND ",popup,&defcolors);
  489.             break;
  490.         case 1:
  491.             w2 = draw_win(CTRWIN,CTRWIN,28,7," MINI MASTERMIND ",popup,&defcolors);
  492.             break;
  493.         case 2:
  494.             w2 = draw_win(CTRWIN,CTRWIN,28,11," ADVANCED MASTERMIND ",popup,&defcolors);
  495.             break;
  496.     }
  497.     slct_win(w2);
  498.     if (mode == 2) count = 4; else count = 2;
  499.  
  500.     for (i=1; i<=count; i++) {
  501.         prtfstr(1,2*i-1,"",w2->wc.text_color,80);
  502.         if ((mode == 0) || (mode == 1))
  503.             prtfstr(1,2*i,menu2_entries[i-1],w2->wc.text_color,80);
  504.         else if (mode == 2)
  505.             prtfstr(1,2*i,menu3_entries[i-1],w2->wc.text_color,80);
  506.     }
  507.  
  508.     if ((mode == 0) || (mode == 1))
  509.         entryno = HiliteMenuEntry(w2,menu2_entries,1,2,2);    /* mode 0 or 1 */
  510.     else if (mode == 2)
  511.         entryno = HiliteMenuEntry(w2,menu3_entries,1,4,2);    /* mode 2 */
  512.  
  513.     if ((mode == 0) || (mode == 1)) {
  514.         if (entryno == 1) Answer = 6;
  515.         else if (entryno == 2) Answer = 7;
  516.     }
  517.     else if (mode == 2) {
  518.         if (entryno == 1) Answer = 8;
  519.         else if (entryno == 2) Answer = 9;
  520.         else if (entryno == 3) Answer = 10;
  521.         else if (entryno == 4) Answer = 11;
  522.     }
  523.  
  524.     if (MousePresent) mouse_on(1);
  525.     set_mouse_window(1,1,80,25);
  526.     rmv_win(w2);
  527.    move_mouse(40,12);    /* move mouse to middle of screen */
  528.     return(Answer);
  529. }
  530.  
  531. void    DrawPeg(int mode, int pegnumber, int xloc, int yloc)
  532. {
  533.     int color[] = {0,BLACK,BLUE,GREEN,CYAN,RED,MAGENTA,BROWN,BROWN,BROWN};
  534.  
  535.     mouse_off(1);
  536.     gotoxy(xloc,yloc);
  537.     if (pegnumber <=7) textattr(WHITE + (color[pegnumber]<<4));
  538.     if ((mode == 1) && (pegnumber >= 1)) {    /* Mini Mastermind */
  539.        cprintf("  %1d  ",pegnumber);
  540.         gotoxy(xloc,yloc-1);
  541.       cprintf("     ");
  542.     }
  543.     else if (((mode==0)||(mode==2)) && ((pegnumber>=1)&&(pegnumber<=7))) {
  544.         cprintf(" %1d ",pegnumber);    /* Mastermind or Adv Mastermind */
  545.     }
  546.     else if ((mode == 2) && (pegnumber == 8)) {        /* Adv Mastermind only */
  547.         textattr(RED + (LIGHTGRAY<<4));
  548.         cprintf("▒▒▒");
  549.         gotoxy(xloc+1,yloc);
  550.         textattr(WHITE + (LIGHTGRAY<<4));
  551.         cprintf("8");
  552.     }
  553.     else if ((mode == 2) && (pegnumber == 9)) {    /* Adv Mastermind only */
  554.         textattr(BLACK + (LIGHTGRAY<<4));
  555.         cprintf("▒▒▒");
  556.       gotoxy(xloc+1,yloc);
  557.         textattr(WHITE + (LIGHTGRAY<<4));
  558.         cprintf("9");
  559.     }
  560.     else if ((mode == 2) && (pegnumber == 10)) {    /* Adv Mastermind only */
  561.         textattr(BLUE + (LIGHTGRAY<<4));
  562.         cprintf("▒▒▒");
  563.       gotoxy(xloc+1,yloc);
  564.         textattr(WHITE + (LIGHTGRAY<<4));
  565.         cprintf("A");
  566.     }
  567.     else if ((mode == 2) && (pegnumber == 11)) {    /* Adv Mastermind only */
  568.         textattr(GREEN + (LIGHTGRAY<<4));
  569.         cprintf("▒▒▒");
  570.       gotoxy(xloc+1,yloc);
  571.         textattr(WHITE + (LIGHTGRAY<<4));
  572.         cprintf("B");
  573.     }
  574.     else if (pegnumber == 0) {                    /* clear out a peg */
  575.         textattr(LIGHTCYAN + (LIGHTGRAY<<4));
  576.         if (mode == 1) {
  577.             cprintf("▒▒▒▒▒");
  578.             gotoxy(xloc,yloc-1);
  579.             cprintf("▒▒▒▒▒");
  580.         }
  581.         else if ((mode == 0) || (mode == 2)) cprintf("▒▒▒");
  582.     }
  583.     else if (pegnumber == -1) {                    /* draw semi clear pegs */
  584.         textattr(LIGHTCYAN + (LIGHTGRAY<<4));
  585.         if (mode == 1) {
  586.             cprintf("░░░░░");
  587.             gotoxy(xloc,yloc-1);
  588.             cprintf("░░░░░");
  589.         }
  590.         else if ((mode == 0) || (mode == 2)) cprintf("░░░");
  591.     }
  592.     mouse_on(1);
  593. }
  594.  
  595. void    DrawScreen(int mode)
  596. {
  597.     if (MousePresent) mouse_off(1);
  598.     textattr(RED + (LIGHTGRAY<<4));
  599.     clrscr();
  600.     DrawBorder();
  601.     DrawScreenText(mode);
  602.     DrawPegs(mode);
  603.     DrawGuessHoles(mode,Turn);
  604.     if (MousePresent) mouse_on(1);
  605. }
  606.  
  607. void    DrawScreenText(int mode)
  608. {
  609.     textattr(RED + (LIGHTGRAY<<4));
  610.     switch (mode) {
  611.         case 0:
  612.             gotoxy(31,1);
  613.             cprintf(" MASTERMIND ");
  614.             break;
  615.         case 1:
  616.             gotoxy(29,1);
  617.             cprintf(" MINI MASTERMIND ");
  618.             break;
  619.         case 2:
  620.             gotoxy(27,1);
  621.             cprintf(" ADVANCED MASTERMIND ");
  622.             break;
  623.     }
  624.     textattr(WHITE + (BLUE<<4));
  625.     gotoxy(2,1); cprintf("OPTIONS <F1>");
  626.     gotoxy(61,1); cprintf(" MAKE GUESS <RTN> ");
  627.  
  628.     textattr(WHITE + (BLUE<<4));  textbackground(LIGHTGRAY);
  629. }
  630.  
  631. void    DrawBorder(void)
  632. {
  633.     int x,y;
  634.  
  635.     textattr(WHITE + (LIGHTGRAY<<4));
  636.  
  637.     x = 1;
  638.     for (y = 2; y <= 24; y++)        { gotoxy(x,y); cprintf("║"); };
  639.     x = 15;
  640.     for (y = 2; y <= 24 ; y++)        { gotoxy(x,y); cprintf("║"); };
  641.     x = 59;
  642.     for (y = 2; y <= 24 ; y++)        { gotoxy(x,y); cprintf("║"); };
  643.     x = 79;
  644.     for (y = 2; y <= 24 ; y++)        { gotoxy(x,y); cprintf("║"); };
  645.     y = 1;
  646.     for (x = 2; x <= 78 ; x++)        { gotoxy(x,y); cprintf("═"); };
  647.     y = 25;
  648.     for (x = 2; x <= 78 ; x++)        { gotoxy(x,y); cprintf("═"); };
  649.  
  650.     gotoxy( 1, 1); cprintf("╔");
  651.     gotoxy(15, 1); cprintf("╦");
  652.    gotoxy(59, 1); cprintf("╦");
  653.     gotoxy(79, 1); cprintf("╗");
  654.     gotoxy( 1,25); cprintf("╚");
  655.     gotoxy(15,25); cprintf("╩");
  656.     gotoxy(59,25); cprintf("╩");
  657.     gotoxy(79,25); cprintf("╝");
  658. }
  659.  
  660. void    DrawPegs(int mode)
  661. {
  662.     int i;
  663.     if (mode==1) {
  664.         for (i=1; i <= NumPegs; i++) DrawPeg(mode, i, 6, 27 - 3*i);
  665.         DrawPeg(mode, 0, 6, 27 - 3*(NumPegs+1)); /* draw a blank peg here */
  666.     }
  667.     else if ((mode == 0) || (mode == 2)) {
  668.         for (i=1; i <= NumPegs; i++) DrawPeg(mode, i, 6, 26 - 2*i);
  669.         DrawPeg(mode, 0, 6, 26 - 2*(NumPegs+1)); /* draw a blank peg here */
  670.     }
  671. }
  672.  
  673. void    DrawGuessHoles(int mode,int turn) /* draw guess holes for present turn */
  674. {
  675.     int    x, y, t;
  676.     if (mode == 1) {    /* Mini Mastermind */
  677.         if (turn <= MaxTurns)
  678.             for (x = 0 ; x <= 3 ; x++) DrawPeg(mode, 0, 20+10*x, 27-3*turn);
  679.             if (turn==1) for (x = 0 ; x <= 3 ; x++)
  680.                 for (t = 2 ; t <= 6 ; t++) DrawPeg(mode, -1, 20+10*x, 27-3*t);
  681.     }
  682.     else if (mode == 0) {    /* Mastermind */
  683.         if (turn <= MaxTurns)
  684.             for (x = 0 ; x <= 3 ; x++) DrawPeg(mode, 0, 20+8*x, 26-2*turn);
  685.          if (turn==1) for (x = 0 ; x <= 3 ; x++)
  686.                 for (t = 2 ; t <= 10 ; t++) DrawPeg(mode, -1, 20+8*x, 26-2*t);
  687.     }
  688.     else if (mode == 2) {    /* Adv Mastermind */
  689.         if (turn <= MaxTurns)
  690.             for (x = 0 ; x <= 4 ; x++) DrawPeg(mode, 0, 20+8*x, 26-2*turn);
  691.             if (turn==1) for (x = 0 ; x <= 4 ; x++)
  692.                 for (t = 2 ; t <= 12 ; t++) DrawPeg(mode, -1, 20+8*x, 26-2*t);
  693.     }
  694. }
  695.  
  696. void    RemoveOldIndicator(int mode)
  697. {
  698.     if (mode == 1) {    /* Mini Mastermind */
  699.         textattr(LIGHTGRAY + (LIGHTGRAY<<4)); /* clear old indicator */
  700.         gotoxy(17 , (26 - 3*Turn) ); cprintf(" ");
  701.         gotoxy(17 , (27 - 3*Turn) ); cprintf(" ");
  702.         gotoxy(57 , (26 - 3*Turn) ); cprintf(" ");
  703.         gotoxy(57 , (27 - 3*Turn) ); cprintf(" ");
  704.     }
  705.     else if (mode == 0) {    /* Mastermind */
  706.        textattr(LIGHTGRAY + (LIGHTGRAY<<4)); /* clear old indicator */
  707.         gotoxy(17 , (26 - 2*Turn) ); cprintf(" ");
  708.         gotoxy(49 , (26 - 2*Turn) ); cprintf(" ");
  709.     }
  710.     if (mode == 2) {    /* Adv Mastermind */
  711.        textattr(LIGHTGRAY + (LIGHTGRAY<<4)); /* clear old indicator */
  712.         gotoxy(17 , (26 - 2*Turn) ); cprintf(" ");
  713.         gotoxy(57 , (26 - 2*Turn) ); cprintf(" ");
  714.     }
  715. }
  716.  
  717. void    DrawNewIndicator(int mode)
  718. {
  719.     if (Turn <= MaxTurns) {
  720.        if (mode == 1) {    /* Mini Mastermind */
  721.             textattr(RED + (LIGHTGRAY<<4)); /* draw new indicator */
  722.             gotoxy(17 , (26 - 3*Turn) ); cprintf("▓");
  723.             gotoxy(17 , (27 - 3*Turn) ); cprintf("▓");
  724.             gotoxy(57 , (26 - 3*Turn) ); cprintf("▓");
  725.             gotoxy(57 , (27 - 3*Turn) ); cprintf("▓");
  726.         }
  727.         else if (mode == 0) {    /* Mastermind */
  728.           textattr(RED + (LIGHTGRAY<<4)); /* draw new indicator */
  729.             gotoxy(17 , (26 - 2*Turn) ); cprintf("▓");
  730.             gotoxy(49 , (26 - 2*Turn) ); cprintf("▓");
  731.         }
  732.         else if (mode == 2) {    /* Adv Mastermind */
  733.           textattr(RED + (LIGHTGRAY<<4)); /* draw new indicator */
  734.             gotoxy(17 , (26 - 2*Turn) ); cprintf("▓");
  735.             gotoxy(57 , (26 - 2*Turn) ); cprintf("▓");
  736.         }
  737.     }
  738. }
  739.  
  740. void    RandomPattern(int mode)
  741. {
  742.     int i;
  743.     randomize();
  744.     if (mode == 0 || mode == 1) {    /* Mastermind & Mini Mastermind */
  745.         PegAnswer[4] = 0;
  746.         for (i = 0 ; i <= 3 ; i++) PegAnswer[i] = 1 + random(NumPegs);
  747.     }
  748.     else if (mode == 2)    /* Adv Mastermind */
  749.         for (i = 0 ; i <= 4 ; i++) PegAnswer[i] = 1 + random(NumPegs);
  750. }
  751.  
  752. int    GetPegType(int mode, char ch)
  753. /* make selected peg blink; return selected peg */
  754. {
  755.     if (mode == 1) {    /* Mini Mastermind */
  756.         if (    ((ch >= 48) && (ch <= NumPegs + 48)) || MouseValid && (
  757.             mouse_in_box(0, 6, 23-3*NumPegs, 10, 24-3*NumPegs) ||
  758.             mouse_in_box(0, 6 , 23 , 10 , 24) ||
  759.             mouse_in_box(0, 6 , 20 , 10 , 21) ||
  760.             mouse_in_box(0, 6 , 17 , 10 , 18) ||
  761.             mouse_in_box(0, 6 , 14 , 10 , 15) ||
  762.             mouse_in_box(0, 6 , 11 , 10 , 12) ||
  763.             mouse_in_box(0, 6 , 8  , 10 , 9 ) ||
  764.             ((NumPegs == 7) && (mouse_in_box(0, 6 , 5  , 10 , 6 )))) ) {
  765.              if (MousePresent) mouse_off(1);
  766.                 DrawPegs(mode); /* stops pegs which were blinking from doing so */
  767.                 if (MousePresent) mouse_on(1);
  768.         }
  769.         if (ch==48||(MouseValid && mouse_in_box(0,6,23-3*NumPegs,10,24-3*NumPegs))) {
  770.             if (MousePresent) mouse_off(1);
  771.             textattr(LIGHTCYAN + (LIGHTGRAY<<4) + BLINK);
  772.             gotoxy(6, 23-3*NumPegs); cprintf("▒▒▒▒▒");
  773.             gotoxy(6, 24-3*NumPegs); cprintf("▒▒▒▒▒");
  774.             if (MousePresent) mouse_on(1);
  775.             return(99);
  776.         }
  777.         else if (ch == 49 || (MouseValid && mouse_in_box(0, 6 , 23 , 10 , 24))) {
  778.             if (MousePresent) mouse_off(1);
  779.             textattr(WHITE + (BLACK<<4) + BLINK);
  780.             gotoxy(6,23); cprintf("     ");
  781.             gotoxy(6,24); cprintf("  1  ");
  782.             if (MousePresent) mouse_on(1);
  783.             return(1);
  784.         }
  785.         else if (ch == 50 || (MouseValid && mouse_in_box(0, 6 , 20 , 10 , 21))) {
  786.             if (MousePresent) mouse_off(1);
  787.             textattr(WHITE + (BLUE<<4) + BLINK);
  788.             gotoxy(6,20); cprintf("     ");
  789.             gotoxy(6,21); cprintf("  2  ");
  790.             if (MousePresent) mouse_on(1);
  791.             return(2);
  792.         }
  793.         else if (ch == 51 || (MouseValid && mouse_in_box(0, 6 , 17 , 10 , 18))) {
  794.             if (MousePresent) mouse_off(1);
  795.             textattr(WHITE + (GREEN<<4) + BLINK);
  796.             gotoxy(6,17); cprintf("     ");
  797.             gotoxy(6,18); cprintf("  3  ");
  798.             if (MousePresent) mouse_on(1);
  799.             return(3);
  800.         }
  801.         else if (ch == 52 || (MouseValid && mouse_in_box(0, 6 , 14 , 10 , 15))) {
  802.             if (MousePresent) mouse_off(1);
  803.             textattr(WHITE + (CYAN<<4) + BLINK);
  804.             gotoxy(6,14); cprintf("     ");
  805.             gotoxy(6,15); cprintf("  4  ");
  806.             if (MousePresent) mouse_on(1);
  807.             return(4);
  808.         }
  809.         else if (ch == 53 || (MouseValid && mouse_in_box(0, 6 , 11 , 10 , 12))) {
  810.             if (MousePresent) mouse_off(1);
  811.             textattr(WHITE + (RED<<4) + BLINK);
  812.             gotoxy(6,11); cprintf("     ");
  813.             gotoxy(6,12); cprintf("  5  ");
  814.             if (MousePresent) mouse_on(1);
  815.             return(5);
  816.         }
  817.         else if (ch == 54 || (MouseValid && mouse_in_box(0, 6 , 8  , 10 , 9 ))) {
  818.             if (MousePresent) mouse_off(1);
  819.             textattr(WHITE + (MAGENTA<<4) + BLINK);
  820.             gotoxy(6,8);  cprintf("     ");
  821.             gotoxy(6,9);  cprintf("  6  ");
  822.             if (MousePresent) mouse_on(1);
  823.             return(6);
  824.         }
  825.         else if ( (NumPegs == 7) &&
  826.                 (ch == 55 || (MouseValid && mouse_in_box(0, 6 , 5  , 10 , 6 ))) ) {
  827.             if (MousePresent) mouse_off(1);
  828.             textattr(WHITE + (BROWN<<4) + BLINK);
  829.             gotoxy(6,5);  cprintf("     ");
  830.             gotoxy(6,6);  cprintf("  7  ");
  831.             if (MousePresent) mouse_on(1);
  832.             return(7);
  833.         }
  834.         else return(0);  /* the selection missed all the peg boxes */
  835.     }
  836.     else if ((mode == 0) || (mode == 2)) {    /* Mastermind or Adv Mastermind */
  837.         if (    ((ch >= 48) && (ch <= 98)) || MouseValid && (
  838.             mouse_in_box(0, 6, 24-2*NumPegs, 8, 24-2*NumPegs) || /* blank peg */
  839.             mouse_in_box(0, 6 , 24 , 8 , 24) ||
  840.             mouse_in_box(0, 6 , 22 , 8 , 22) ||
  841.             mouse_in_box(0, 6 , 20 , 8 , 20) ||
  842.             mouse_in_box(0, 6 , 18 , 8 , 18) ||
  843.             mouse_in_box(0, 6 , 16 , 8 , 16) ||
  844.             mouse_in_box(0, 6 , 14 , 8 , 14 ) ||
  845.             ((NumPegs >= 7) && (mouse_in_box(0, 6 , 12  , 8 , 12 ))) ||
  846.             ((NumPegs >= 8) && (mouse_in_box(0, 6 , 10  , 8 , 10 ))) ||
  847.             ((NumPegs >= 9) && (mouse_in_box(0, 6 ,  8  , 8 ,  8 ))) ||
  848.             ((NumPegs >=10) && (mouse_in_box(0, 6 ,  6  , 8 ,  6 ))) ||
  849.             ((NumPegs ==11) && (mouse_in_box(0, 6 ,  4  , 8 ,  4 )))) ) {
  850.              if (MousePresent) mouse_off(1);
  851.                 DrawPegs(mode); /* stops pegs which were blinking from doing so */
  852.                 if (MousePresent) mouse_on(1);
  853.         }
  854.         if (ch==48||(MouseValid && mouse_in_box(0,6,24-2*NumPegs,8,24-2*NumPegs))) {
  855.             if (MousePresent) mouse_off(1);
  856.          textattr(LIGHTCYAN + (LIGHTGRAY<<4) + BLINK);
  857.             gotoxy(6,24-2*NumPegs); cprintf("▒▒▒");
  858.             if (MousePresent) mouse_on(1);
  859.             return(99);
  860.         }
  861.         else if (ch == 49 || (MouseValid && mouse_in_box(0, 6 , 24 , 8 , 24))) {
  862.             if (MousePresent) mouse_off(1);
  863.             textattr(WHITE + (BLACK<<4) + BLINK);
  864.             gotoxy(6,24); cprintf(" 1 ");
  865.             if (MousePresent) mouse_on(1);
  866.             return(1);
  867.         }
  868.         else if (ch == 50 || (MouseValid && mouse_in_box(0, 6 , 22 , 8 , 22))) {
  869.             if (MousePresent) mouse_off(1);
  870.             textattr(WHITE + (BLUE<<4) + BLINK);
  871.             gotoxy(6,22); cprintf(" 2 ");
  872.             if (MousePresent) mouse_on(1);
  873.             return(2);
  874.         }
  875.         else if (ch == 51 || (MouseValid && mouse_in_box(0, 6 , 20 , 8 , 20))) {
  876.             if (MousePresent) mouse_off(1);
  877.             textattr(WHITE + (GREEN<<4) + BLINK);
  878.             gotoxy(6,20); cprintf(" 3 ");
  879.             if (MousePresent) mouse_on(1);
  880.             return(3);
  881.         }
  882.         else if (ch == 52 || (MouseValid && mouse_in_box(0, 6 , 18 , 8 , 18))) {
  883.             if (MousePresent) mouse_off(1);
  884.             textattr(WHITE + (CYAN<<4) + BLINK);
  885.             gotoxy(6,18); cprintf(" 4 ");
  886.             if (MousePresent) mouse_on(1);
  887.             return(4);
  888.         }
  889.         else if (ch == 53 || (MouseValid && mouse_in_box(0, 6 , 16 , 8 , 16))) {
  890.             if (MousePresent) mouse_off(1);
  891.             textattr(WHITE + (RED<<4) + BLINK);
  892.             gotoxy(6,16); cprintf(" 5 ");
  893.             if (MousePresent) mouse_on(1);
  894.             return(5);
  895.         }
  896.         else if (ch == 54 || (MouseValid && mouse_in_box(0, 6 , 14 , 8 , 14))) {
  897.             if (MousePresent) mouse_off(1);
  898.             textattr(WHITE + (MAGENTA<<4) + BLINK);
  899.             gotoxy(6,14);  cprintf(" 6 ");
  900.             if (MousePresent) mouse_on(1);
  901.             return(6);
  902.         }
  903.         else if ( (NumPegs >= 7) &&
  904.                 (ch == 55 || (MouseValid && mouse_in_box(0, 6 , 12 , 8 , 12))) ) {
  905.             if (MousePresent) mouse_off(1);
  906.             textattr(WHITE + (BROWN<<4) + BLINK);
  907.             gotoxy(6,12);  cprintf(" 7 ");
  908.             if (MousePresent) mouse_on(1);
  909.             return(7);
  910.         }
  911.         else if ( (NumPegs >= 8) &&
  912.                 (ch == 56 || (MouseValid && mouse_in_box(0, 6 , 10 , 8 , 10))) ) {
  913.             if (MousePresent) mouse_off(1);
  914.             textattr(RED + (LIGHTGRAY<<4));
  915.             gotoxy(6,10);  cprintf("▒▒▒");
  916.             textattr(WHITE + (LIGHTGRAY<<4) + BLINK);
  917.             gotoxy(7,10);  cprintf("8");
  918.             if (MousePresent) mouse_on(1);
  919.             return(8);
  920.         }
  921.         else if ( (NumPegs >= 9) &&
  922.                 (ch == 57 || (MouseValid && mouse_in_box(0, 6 , 8 , 8 , 8))) ) {
  923.             if (MousePresent) mouse_off(1);
  924.             textattr(BLACK + (LIGHTGRAY<<4));
  925.             gotoxy(6,8);  cprintf("▒▒▒");
  926.          textattr(WHITE + (LIGHTGRAY<<4) + BLINK);
  927.             gotoxy(7,8);  cprintf("9");
  928.             if (MousePresent) mouse_on(1);
  929.             return(9);
  930.         }
  931.         else if ( (NumPegs >= 10) &&
  932.                 ((ch==65) || (ch==97) || (MouseValid && mouse_in_box(0, 6 , 6 , 8 , 6))) ) {
  933.             if (MousePresent) mouse_off(1);
  934.             textattr(BLUE + (LIGHTGRAY<<4));
  935.             gotoxy(6,6);  cprintf("▒▒▒");
  936.          textattr(WHITE + (LIGHTGRAY<<4) + BLINK);
  937.             gotoxy(7,6);  cprintf("A");
  938.             if (MousePresent) mouse_on(1);
  939.             return(10);
  940.         }
  941.         else if ( (NumPegs >= 11) &&
  942.                 ((ch==66) || (ch==98) || (MouseValid && mouse_in_box(0, 6 , 4 , 8 , 4))) ) {
  943.             if (MousePresent) mouse_off(1);
  944.             textattr(GREEN + (LIGHTGRAY<<4));
  945.             gotoxy(6,4);  cprintf("▒▒▒");
  946.          textattr(WHITE + (LIGHTGRAY<<4) + BLINK);
  947.             gotoxy(7,4);  cprintf("B");
  948.             if (MousePresent) mouse_on(1);
  949.             return(11);
  950.         }
  951.         else return(0);  /* the selection missed all the peg boxes */
  952.     }
  953. }
  954.  
  955. void    SetPegPosition(int mode)
  956. /*    This function positions the arrow indicators > & < when keyboard
  957.     entry is used. */
  958. {
  959.     if (MousePresent) mouse_off(1);
  960.  
  961.     if (mode == 1) {    /* Mini Mastermind */
  962.         if (FunctionKey && ch == 75) { /* left arrow */
  963.             PegPosition--;
  964.             if (PegPosition == 0) PegPosition = 4;
  965.         }
  966.         else if (FunctionKey && ch == 77) { /* right arrow */
  967.             PegPosition++;
  968.             if (PegPosition == 5) PegPosition = 1;
  969.         }
  970.         textattr(RED + (LIGHTGRAY<<4));
  971.         ClearSetPeg(mode);
  972.         if (Turn <= 6) {
  973.             gotoxy(9 + 10*PegPosition , (27 - 3*Turn) );  cprintf(">");
  974.             gotoxy(15 + 10*PegPosition , (27 - 3*Turn) );  cprintf("<");
  975.         }
  976.     }
  977.     else if (mode == 0)  {    /* Mastermind */
  978.         if (FunctionKey && ch == 75) { /* left arrow */
  979.             PegPosition--;
  980.             if (PegPosition == 0) PegPosition = 4;
  981.         }
  982.         else if (FunctionKey && ch == 77) { /* right arrow */
  983.             PegPosition++;
  984.             if (PegPosition == 5) PegPosition = 1;
  985.         }
  986.         textattr(RED + (LIGHTGRAY<<4));
  987.         ClearSetPeg(mode);
  988.         if (Turn <= 10) {
  989.             gotoxy(11 + 8*PegPosition , (26 - 2*Turn) );  cprintf(">");
  990.             gotoxy(15 + 8*PegPosition , (26 - 2*Turn) );  cprintf("<");
  991.         }
  992.     }
  993.     else if (mode == 2) {    /* Adv Mastermind */
  994.         if (FunctionKey && ch == 75) { /* left arrow */
  995.             PegPosition--;
  996.             if (PegPosition == 0) PegPosition = 5;
  997.         }
  998.         else if (FunctionKey && ch == 77) { /* right arrow */
  999.             PegPosition++;
  1000.             if (PegPosition == 6) PegPosition = 1;
  1001.         }
  1002.         textattr(RED + (LIGHTGRAY<<4));
  1003.         ClearSetPeg(mode);
  1004.         if (Turn <= 12) {
  1005.             gotoxy(11 + 8*PegPosition , (26 - 2*Turn) );  cprintf(">");
  1006.             gotoxy(15 + 8*PegPosition , (26 - 2*Turn) );  cprintf("<");
  1007.         }
  1008.     }
  1009.     if (MousePresent) mouse_on(1);
  1010. }
  1011.  
  1012. void    ClearSetPeg(int mode)
  1013. {
  1014.     if (mode == 1) {    /* Mini Mastermind */
  1015.       if (Turn > 1) { /* clear markers from previous guess */
  1016.             for (i=19; i<=49; i=i+10) {gotoxy(i,(27-3*(Turn-1)) ); cprintf(" "); }
  1017.             for (i=25; i<=55; i=i+10) {gotoxy(i,(27-3*(Turn-1)) ); cprintf(" "); }
  1018.         }
  1019.         for (i = 19; i <= 49; i=i+10) { gotoxy(i, (27 - 3*Turn) ); cprintf(" ");}
  1020.         for (i = 25; i <= 55; i=i+10) { gotoxy(i, (27 - 3*Turn) ); cprintf(" ");}
  1021.     }
  1022.     else if (mode == 0) {    /* Mastermind */
  1023.         if (Turn > 1) { /* clear markers from previous guess */
  1024.             for (i=19; i<=43; i=i+8) {gotoxy(i,(26-2*(Turn-1)) ); cprintf(" "); }
  1025.             for (i=23; i<=47; i=i+8) {gotoxy(i,(26-2*(Turn-1)) ); cprintf(" "); }
  1026.         }
  1027.         for (i = 19; i <= 43; i=i+8) { gotoxy(i, (26 - 2*Turn) ); cprintf(" ");}
  1028.         for (i = 23; i <= 47; i=i+8) { gotoxy(i, (26 - 2*Turn) ); cprintf(" ");}
  1029.     }
  1030.     else if (mode == 2) {    /* Adv Mastermind */
  1031.        if (Turn > 1) { /* clear markers from previous guess */
  1032.             for (i=19; i<=51; i=i+8) {gotoxy(i,(26-2*(Turn-1)) ); cprintf(" "); }
  1033.             for (i=23; i<=55; i=i+8) {gotoxy(i,(26-2*(Turn-1)) ); cprintf(" "); }
  1034.         }
  1035.         for (i = 19; i <= 51; i=i+8) { gotoxy(i, (26 - 2*Turn) ); cprintf(" ");}
  1036.         for (i = 23; i <= 55; i=i+8) { gotoxy(i, (26 - 2*Turn) ); cprintf(" ");}
  1037.     }
  1038. }
  1039.  
  1040. void    PutPegType(int mode) /* place selected peg in box; undo blinking peg */
  1041. {
  1042.     MissedBox = FALSE;
  1043.     if (mode == 1) {    /* Mini Mastermind */
  1044.         if (((ch >= 48) && (ch <= NumPegs+48) && PegPosition == 1)
  1045.             || MouseValid && mouse_in_box(0,20,(26 - 3*Turn),24,(27 - 3*Turn) ))
  1046.         {
  1047.             if (MousePresent) mouse_off(1);
  1048.             if (PegNumber == 99) {
  1049.                 DrawPeg(mode, 0, 20, 27-3*Turn);
  1050.                 PegGuess[0] = 0;
  1051.             }
  1052.             else {
  1053.                 PegGuess[0] = PegNumber;
  1054.                 DrawPeg(mode, PegNumber, 20, 27-3*Turn);
  1055.             }
  1056.         }
  1057.         else if (((ch >= 48) && (ch <= NumPegs+48) && PegPosition == 2)
  1058.             || MouseValid && mouse_in_box(0,30,(26 - 3*Turn),34,(27 - 3*Turn) ))
  1059.         {
  1060.             if (MousePresent) mouse_off(1);
  1061.             if (PegNumber == 99) {
  1062.                 DrawPeg(mode, 0, 30, 27-3*Turn);
  1063.                 PegGuess[1]= 0;
  1064.             }
  1065.             else {
  1066.                 PegGuess[1] = PegNumber;
  1067.                 DrawPeg(mode, PegNumber, 30, 27-3*Turn);
  1068.             }
  1069.         }
  1070.         else if (((ch >= 48) && (ch <= NumPegs+48) && PegPosition == 3)
  1071.             || MouseValid && mouse_in_box(0,40,(26 - 3*Turn),44,(27 - 3*Turn) ))
  1072.         {
  1073.             if (MousePresent) mouse_off(1);
  1074.             if (PegNumber == 99) {
  1075.                 DrawPeg(mode, 0, 40, 27-3*Turn);
  1076.                 PegGuess[2]= 0;
  1077.             }
  1078.             else {
  1079.                 PegGuess[2] = PegNumber;
  1080.                 DrawPeg(mode, PegNumber, 40, 27-3*Turn);
  1081.             }
  1082.         }
  1083.         else if (((ch >= 48) && (ch <= NumPegs+48) && PegPosition == 4)
  1084.             || MouseValid && mouse_in_box(0,50,(26 - 3*Turn),54,(27 - 3*Turn) ))
  1085.         {
  1086.             if (MousePresent) mouse_off(1);
  1087.             if (PegNumber == 99) {
  1088.                 DrawPeg(mode, 0, 50, 27-3*Turn);
  1089.                 PegGuess[3]= 0;
  1090.             }
  1091.             else {
  1092.                 PegGuess[3] = PegNumber;
  1093.                 DrawPeg(mode, PegNumber, 50, 27-3*Turn);
  1094.             }
  1095.         }
  1096.     }
  1097.     else if ((mode == 0)||(mode == 2)) { /* Mastermind or Adv Mastermind */
  1098.         if (((ch >= 48) && (ch <= 98) && PegPosition == 1)
  1099.             || MouseValid && mouse_in_box(0,20,(26 - 2*Turn),22,(26 - 2*Turn) ))
  1100.         {
  1101.             if (MousePresent) mouse_off(1);
  1102.             if (PegNumber == 99) {
  1103.                 DrawPeg(mode, 0, 20, 26-2*Turn);
  1104.                 PegGuess[0]= 0;
  1105.             }
  1106.             else {
  1107.                 PegGuess[0] = PegNumber;
  1108.                 DrawPeg(mode, PegNumber, 20, 26-2*Turn);
  1109.             }
  1110.         }
  1111.         else if (((ch >= 48) && (ch <= 98) && PegPosition == 2)
  1112.             || MouseValid && mouse_in_box(0,28,(26 - 2*Turn),30,(26 - 2*Turn) ))
  1113.         {
  1114.             if (MousePresent) mouse_off(1);
  1115.             if (PegNumber == 99) {
  1116.                 DrawPeg(mode, 0, 28, 26-2*Turn);
  1117.                 PegGuess[1]= 0;
  1118.             }
  1119.             else {
  1120.                 PegGuess[1] = PegNumber;
  1121.                 DrawPeg(mode, PegNumber, 28, 26-2*Turn);
  1122.             }
  1123.         }
  1124.         else if (((ch >= 48) && (ch <= 98) && PegPosition == 3)
  1125.             || MouseValid && mouse_in_box(0,36,(26 - 2*Turn),38,(26 - 2*Turn) ))
  1126.         {
  1127.             if (MousePresent) mouse_off(1);
  1128.             if (PegNumber == 99) {
  1129.                 DrawPeg(mode, 0, 36, 26-2*Turn);
  1130.                 PegGuess[2]= 0;
  1131.             }
  1132.             else {
  1133.                 PegGuess[2] = PegNumber;
  1134.                 DrawPeg(mode, PegNumber, 36, 26-2*Turn);
  1135.             }
  1136.         }
  1137.         else if (((ch >= 48) && (ch <= 98) && PegPosition == 4)
  1138.             || MouseValid && mouse_in_box(0,44,(26 - 2*Turn),46,(26 - 2*Turn) ))
  1139.         {
  1140.             if (MousePresent) mouse_off(1);
  1141.             if (PegNumber == 99) {
  1142.                 DrawPeg(mode, 0, 44, 26-2*Turn);
  1143.                 PegGuess[3]= 0;
  1144.             }
  1145.             else {
  1146.                 PegGuess[3] = PegNumber;
  1147.                 DrawPeg(mode, PegNumber, 44, 26-2*Turn);
  1148.             }
  1149.         }
  1150.         else if ((mode == 2) && (((ch >= 48) && (ch <= 98) && PegPosition == 5)
  1151.             || MouseValid && mouse_in_box(0,52,(26 - 2*Turn),54,(26 - 2*Turn) )))
  1152.         {
  1153.             if (MousePresent) mouse_off(1);
  1154.             if (PegNumber == 99) {
  1155.                 DrawPeg(mode, 0, 52, 26-2*Turn);
  1156.                 PegGuess[4]= 0;
  1157.             }
  1158.             else {
  1159.                 PegGuess[4] = PegNumber;
  1160.                 DrawPeg(mode, PegNumber, 52, 26-2*Turn);
  1161.             }
  1162.         }
  1163.     }
  1164.     else MissedBox = TRUE;
  1165.  
  1166.     if (MissedBox && HelpOn) {
  1167.         if (PegNumber == 0) GiveHelpInformation(1);
  1168.         else if (PegGuess[0] != 0 && PegGuess[1] != 0
  1169.             && PegGuess[2] != 0 && PegGuess[3] != 0) GiveHelpInformation(2);
  1170.         else GiveHelpInformation(3); }
  1171.  
  1172.     if (MousePresent) mouse_on(1);
  1173. }
  1174.  
  1175. void    MakeGuess(int mode)
  1176. {
  1177.     int    x;
  1178.     if (MousePresent) mouse_off(1);
  1179.  
  1180.     /* Mini Mastermind */
  1181.     if     ((mode == 1) && (PegGuess[0] != 0 && PegGuess[1] != 0
  1182.             && PegGuess[2] != 0 && PegGuess[3] != 0)) {
  1183.         GetBlackAndWhiteClues();    /* sets BlackNum & WhiteNum */
  1184.  
  1185.         textbackground(BLACK); /* place black clues */
  1186.         for (x = 0 ; x <= (BlackNum - 1) ; x++) {
  1187.             gotoxy(63 + 3*x , 27 - (3*Turn));
  1188.             cprintf("  ");
  1189.         }
  1190.         textattr(WHITE + (LIGHTGRAY<<4)); /* place white clues */
  1191.         for (x = BlackNum + 1 ; x <= (BlackNum + WhiteNum) ; x++) {
  1192.             gotoxy(60 + 3*x , 27 - (3*Turn));
  1193.             cprintf("██");
  1194.         }
  1195.         RemoveOldIndicator(mode);
  1196.         ClearSetPeg(mode);
  1197.         Turn++;
  1198.         if (UseKbd) SetPegPosition(mode);
  1199.         DrawNewIndicator(mode);
  1200.         DrawGuessHoles(mode,Turn);
  1201.  
  1202.         if ((Turn == 7) && (BlackNum != 4)) YouLose();
  1203.         if ((BlackNum == 4)) YouWin();
  1204.         for (i = 0 ; i <= 3 ; i++) PegGuess[i] = 0;
  1205.         if ( !ULose && !UWin ) BeepHi();
  1206.     }
  1207.     /* Mastermind */
  1208.     else if ((mode == 0) && (PegGuess[0] != 0 && PegGuess[1] != 0
  1209.             && PegGuess[2] != 0 && PegGuess[3] != 0)) {
  1210.         GetBlackAndWhiteClues();    /* sets BlackNum & WhiteNum */
  1211.  
  1212.         textbackground(BLACK); /* place black clues */
  1213.         for (x = 0 ; x <= (BlackNum - 1) ; x++) {
  1214.             gotoxy(63 + 3*x , 26 - (2*Turn));
  1215.             cprintf("  ");
  1216.         }
  1217.         textattr(WHITE + (LIGHTGRAY<<4)); /* place white clues */
  1218.         for (x = BlackNum + 1 ; x <= (BlackNum + WhiteNum) ; x++) {
  1219.             gotoxy(60 + 3*x , 26 - (2*Turn));
  1220.             cprintf("██");
  1221.         }
  1222.         RemoveOldIndicator(mode);
  1223.         ClearSetPeg(mode);
  1224.         Turn++;
  1225.         if (UseKbd) SetPegPosition(mode);
  1226.         DrawNewIndicator(mode);
  1227.         DrawGuessHoles(mode,Turn);
  1228.  
  1229.         if ((Turn == 11) && (BlackNum != 4)) YouLose();
  1230.         if ((BlackNum == 4)) YouWin();
  1231.         for (i = 0 ; i <= 3 ; i++) PegGuess[i] = 0;
  1232.         if ( !ULose && !UWin ) BeepHi();
  1233.     }
  1234.     /* Adv Mastermind */
  1235.     else if     ((mode == 2) && (PegGuess[0] != 0 && PegGuess[1] != 0
  1236.             && PegGuess[2] != 0 && PegGuess[3] != 0 && PegGuess[4] != 0)) {
  1237.         GetBlackAndWhiteClues();    /* sets BlackNum & WhiteNum */
  1238.  
  1239.         textbackground(BLACK); /* place black clues */
  1240.         for (x = 0 ; x <= (BlackNum - 1) ; x++) {
  1241.             gotoxy(63 + 3*x , 26 - (2*Turn));
  1242.             cprintf("  ");
  1243.         }
  1244.         textattr(WHITE + (LIGHTGRAY<<4)); /* place white clues */
  1245.         for (x = BlackNum + 1 ; x <= (BlackNum + WhiteNum) ; x++) {
  1246.             gotoxy(60 + 3*x , 26 - (2*Turn));
  1247.             cprintf("██");
  1248.         }
  1249.         RemoveOldIndicator(mode);
  1250.         ClearSetPeg(mode);
  1251.         Turn++;
  1252.         if (UseKbd) SetPegPosition(mode);
  1253.         DrawNewIndicator(mode);
  1254.         DrawGuessHoles(mode,Turn);
  1255.  
  1256.         if ((Turn == 13) && (BlackNum != 5)) YouLose();
  1257.         if ((BlackNum == 5)) YouWin();
  1258.         for (i = 0 ; i <= 4 ; i++) PegGuess[i] = 0;
  1259.         if ( !ULose && !UWin ) BeepHi();
  1260.     }
  1261.     else            /* not time to MAKE GUESS */
  1262.     {
  1263.         if (HelpOn) GiveHelpInformation(4);
  1264.     }
  1265.  
  1266.     if (MousePresent) mouse_on(1);
  1267. }
  1268.  
  1269. void    GetBlackAndWhiteClues()    /* sets BlackNum & WhiteNum */
  1270. {
  1271.     int    i, j, k;    /* i & j for whitenum, k for blacknum */
  1272.     int UsedWhiteAnswer[5], UsedWhiteGuess[5], Pegs;
  1273.  
  1274.     if ((mode == 0) || (mode == 1)) Pegs = 4; else Pegs = 5;
  1275.  
  1276.     BlackNum = 0;    WhiteNum = 0;
  1277.     for (i = 0 ; i <= Pegs-1 ; i++) {
  1278.         UsedWhiteAnswer[i] = FALSE;
  1279.         UsedWhiteGuess[i] = FALSE;
  1280.     }
  1281.  
  1282.     for (k=0; k <= Pegs-1; k++) if (PegGuess[k] == PegAnswer[k]) BlackNum++;
  1283.  
  1284.     for (i = 0 ; i <= Pegs-1 ; i++) {
  1285.         for (j = 0 ; j <= Pegs-1 ; j++) {
  1286.             if ((PegGuess[i] != PegAnswer[i]) && (PegGuess[j] != PegAnswer[j])) {
  1287.                 if ((!UsedWhiteGuess[j]) && (!UsedWhiteAnswer[i])) {
  1288.                     if ( PegGuess[j] == PegAnswer[i] ) {
  1289.                         WhiteNum++;
  1290.                         UsedWhiteAnswer[i] = TRUE;
  1291.                         UsedWhiteGuess[j] = TRUE;
  1292.                     }
  1293.                 }
  1294.             }
  1295.         }
  1296.     }
  1297. }
  1298.  
  1299. void YouLose(void)
  1300. {
  1301.     if (MousePresent) mouse_off(1);
  1302.     ULose = TRUE;
  1303.    BeepLo();
  1304.     GiveWinOrLoseStatus(0);    /* YOU LOST message */
  1305.     if (MousePresent) mouse_on(1);
  1306. }
  1307.  
  1308. void    YouWin(void)
  1309. {
  1310.     int    i;
  1311.     if (MousePresent) mouse_off(1);
  1312.     UWin = TRUE;
  1313.     if (HasCheated)
  1314.     {
  1315.        BeepLo();
  1316.         GiveWinOrLoseStatus(2);        /* NEXT TIME ... DON'T CHEAT message */
  1317.     }
  1318.     else
  1319.     {
  1320.        for (i = 1 ; i <= 3 ; i++) BeepHi();
  1321.         GiveWinOrLoseStatus(1);        /* YOU WON message */
  1322.     }
  1323.     if (MousePresent) mouse_on(1);
  1324. }
  1325.  
  1326. void    GiveHelpInformation(int msg)
  1327. {
  1328.     char *help_entries[] = { /* each message is 3 lines long */
  1329.         "",
  1330.         "MOUSE: Select peg (on left), then place it", /* msg = 1 */
  1331.         "on board (below).  KEYBOARD: Use left &",
  1332.         "right arrows & number keys.",
  1333.         "If you are ready to make a guess select",  /* msg = 2 */
  1334.         "MAKE GUESS.  If not, you may still change",
  1335.         "any of your guesses.",
  1336.         "EITHER place the selected peg on the board",/* msg = 3 */
  1337.         "OR select a different peg, and then place",
  1338.         "it on the board.",
  1339.         "You are not allowed to make a guess",       /* msg = 4 */
  1340.         "until you have placed a guess in each",
  1341.         "of the guess locations.",
  1342.     };
  1343.  
  1344.     windesc *help_win;
  1345.     int i,j;
  1346.  
  1347.     if (MousePresent) mouse_off(1);
  1348.  
  1349.     help_win = draw_win(CTRWIN,CTRWIN,44,5," HELP ",popup,&msgcolors);
  1350.     slct_win(help_win);
  1351.  
  1352.     for (i=3*msg-2,j=1; i<=3*msg; i++,j++) prtfstr(1,j,help_entries[i],help_win->wc.text_color,80);
  1353.     BeepHi();
  1354.  
  1355.     if (MousePresent) mouse_on(1);
  1356.     while(!kbhit() && !button_press(LEFT) && !button_press(RIGHT));
  1357.     if (kbhit()) getch();
  1358.     rmv_win(help_win);
  1359. }
  1360.  
  1361. void    SettingsMenu(void)
  1362. {
  1363.     windesc *w1;
  1364.     int i, entryno = 1, init_entryno, x, y, Done = FALSE, mousex, mousey;
  1365.     unsigned int key;
  1366.     char    msg[30],msg1[30],msg2[30],msg3[30],msg4[30],
  1367.             msg5[30],msg6[30],msg7[30],msg8[30];
  1368.  
  1369.     mouse_txt_posn(&mousex,&mousey);        /* save mouse's original position */
  1370.     if (MousePresent) mouse_off(1);
  1371.  
  1372.     w1 = draw_win(26,CTRWIN,23,19," SETTINGS ",popup,&defcolors);
  1373.     slct_win(w1);
  1374.  
  1375.     strcpy(msg1," Restart");
  1376.     if (SoundToggle) strcpy(msg2," Sound is ON ");
  1377.         else strcpy(msg2," Sound is OFF");
  1378.     if (HelpOn) strcpy(msg3," Messages are ON ");
  1379.         else strcpy(msg3," Messages are OFF");
  1380.     strcpy(msg4," Cheat");
  1381.     strcpy(msg5," Instructions");
  1382.     strcpy(msg6," Return to Main Menu");
  1383.     strcpy(msg7," Return to DOS");
  1384.     strcpy(msg8," Exit Menu <ESC>");
  1385.  
  1386.     prtfstr(1,2,msg1,w1->wc.text_color,80);
  1387.     prtfstr(1,4,msg2,w1->wc.text_color,80);
  1388.     prtfstr(1,6,msg3,w1->wc.text_color,80);
  1389.     prtfstr(1,8,msg4,w1->wc.text_color,80);
  1390.     prtfstr(1,10,msg5,w1->wc.text_color,80);
  1391.     prtfstr(1,12,msg6,w1->wc.text_color,80);
  1392.     prtfstr(1,14,msg7,w1->wc.text_color,80);
  1393.     prtfstr(1,16,msg8,w1->wc.text_color,80);
  1394.  
  1395.     do {
  1396.         if (UWin || ULose) {    /* if game just finished put cursor on Restart */
  1397.             init_entryno = 1;
  1398.             UWin = FALSE;
  1399.             ULose = FALSE;
  1400.         }
  1401.         else init_entryno = entryno;
  1402.         entryno = HiliteSettingsEntry(w1,init_entryno);    /* get an entry */
  1403.  
  1404.         switch(entryno) {
  1405.             case 1:
  1406.                 RestartFlag = TRUE;
  1407.                 Done = TRUE;
  1408.                 break;
  1409.             case 2:
  1410.                 SoundToggle = !SoundToggle;
  1411.                 break;
  1412.             case 3:
  1413.                 HelpOn = !HelpOn;
  1414.                 break;
  1415.             case 4:
  1416.                 Cheat(mode);
  1417.                 break;
  1418.             case 5:
  1419.                 Instructions(1);
  1420.                 Instructions(3);
  1421.                 break;
  1422.             case 6:
  1423.                 RestartFlag = Done = TRUE;
  1424.                 GoForever = Loop = FALSE;
  1425.                 break;
  1426.             case 7:
  1427.                 Quit();
  1428.                 break;
  1429.             case 8:
  1430.                 Done = TRUE;
  1431.                 break;
  1432.         }
  1433.     } while (!Done);
  1434.  
  1435.     if (MousePresent) mouse_on(1);
  1436.     set_mouse_window(1,1,80,25);
  1437.     move_mouse(mousex,mousey);        /* move mouse to its original position */
  1438.  
  1439.     rmv_win(w1);
  1440. }
  1441.  
  1442. void    GiveWinOrLoseStatus(int msg)
  1443. {
  1444.     char *entries[] = {
  1445.         "      SORRY ... YOU LOST !",                /* msg = 0 */
  1446.         " CONGRATULATIONS ... YOU WON !!!",        /* msg = 1 */
  1447.         "   NEXT TIME ... DON'T CHEAT !"            /* msg = 2 */
  1448.     };
  1449.  
  1450.     windesc *win;
  1451.     int i,j;
  1452.  
  1453.     if (MousePresent) mouse_off(1);
  1454.  
  1455.     win = draw_win(CTRWIN,CTRWIN,35,5,"",popup,&errcolors);
  1456.     slct_win(win);
  1457.  
  1458.     prtfstr(1,2,entries[msg],win->wc.text_color,80);
  1459.  
  1460.     if (MousePresent) mouse_on(1);
  1461.     while(!kbhit() && !button_press(LEFT) && !button_press(RIGHT));
  1462.     if (kbhit()) getch();
  1463.     rmv_win(win);
  1464. }
  1465.  
  1466. void Cheat(int mode)
  1467. {
  1468.     windesc *cheat_win;
  1469.     int i,j,count;
  1470.  
  1471.     if ((mode == 0) || (mode == 1)) count = 4;
  1472.     else count = 5;
  1473.  
  1474.     if (MousePresent) mouse_off(1);
  1475.     HasCheated = TRUE;
  1476.  
  1477.     cheat_win = draw_win(19,10,38,4,"",popup,&graycolors);
  1478.     slct_win(cheat_win);
  1479.  
  1480.     if (mode == 1) {    /* Mini Mastermind */
  1481.         for (i = 0; i <= count-1; i++) DrawPeg(mode, PegAnswer[i], 10*i + 1, 2);
  1482.     }
  1483.     else if ((mode == 0) || (mode == 2)) {    /* Mastermind or Adv Mastermind */
  1484.         for (i = 0; i <= count-1; i++) DrawPeg(mode, PegAnswer[i], 8*i + 1, 2);
  1485.     }
  1486.  
  1487.     if (MousePresent) mouse_on(1);
  1488.     while(!kbhit() && !button_press(LEFT) && !button_press(RIGHT));
  1489.     if (kbhit()) getch();
  1490.     rmv_win(cheat_win);
  1491. }
  1492.  
  1493. void Instructions(int select)
  1494. /* select works as follows :
  1495.     1:    give windows 1, 2
  1496.     2:    give windows 3, 4, 5 & 6
  1497.     3: give window 7  */
  1498. {
  1499.     char *instr_entries[] = {
  1500.         "",
  1501.         "The object is to guess a secret code.",    /* window 1 */
  1502.         "Use the  mouse to  select one  of the",
  1503.         "numbered pegs on the left, then place",
  1504.         "it in a location below. For keyboard,",
  1505.         "use left & right arrows and enter the",
  1506.         "appropriate peg number. After filling",
  1507.         "each of  the guess locations,  select",
  1508.         "MAKE GUESS, or hit a carriage return.",
  1509.         "< press a button or key to continue >",
  1510.  
  1511.         "After  making a  guess,  you  will be",    /* window 2 */
  1512.         "provided with clues.  Each black clue",
  1513.         "indicates one guess is of the correct",
  1514.         "color & in the correct location. Each",
  1515.         "white clue  indicates one guess is of",
  1516.         "the correct  color  but in the  wrong",
  1517.         "location. Use these clues to find the",
  1518.         "secret code (get all black clues).   ",
  1519.         "< press a button or key to continue >",
  1520.  
  1521.         "EXAMPLE : Suppose the solution to the",    /* window 3 */
  1522.         "secret  code is  (3 4 1 4)  as  shown",
  1523.         "above.  If you  make the  guess shown",
  1524.         "below (4 1 1 3)  and then select MAKE",
  1525.         "GUESS, you  would be  presented  with",
  1526.         "the  clues shown at the  lower  right",
  1527.         "corner of the screen.                ",
  1528.         "                                     ",
  1529.         "< press a button or key to continue >",
  1530.  
  1531.         "The one BLACK clue corresponds to a 1",    /* window 4 */
  1532.         "being an exact  match to part  of the",
  1533.         "code. The WHITE clues correspond to a",
  1534.         "4 and a 3 being correct  guesses, but",
  1535.         "in the  incorrect  locations.  Try to",
  1536.         "guess  the exact  solution (get  four",
  1537.         "black clues) in ten or less turns  by",
  1538.         "using information in the clues.      ",
  1539.         "< press a button or key to continue >",
  1540.  
  1541.         "MINI MASTERMIND :  Same as Mastermind",    /* window 5 */
  1542.         "except you  get only 6 turns to  find",
  1543.         "the code. This is more difficult.    ",
  1544.         "ADVANCED MASTERMIND :  There are five",
  1545.         "tiles in the  code,  each may take on",
  1546.         "either 8, 9, 10 or 11 colors. You get",
  1547.         "twelve turns to find the secret code.",
  1548.         "This is much more difficult.         ",
  1549.         "< press a button or key to continue >",
  1550.  
  1551.         "This  concludes the  instructions for",    /* window 6 */
  1552.         "MASTERMIND ,  MINI  MASTERMIND    and",
  1553.         "ADVANCED MASTERMIND.  These games are",
  1554.         "easy to play but they are not so easy",
  1555.         "to master. The various levels of play",
  1556.         "may challenge you for a long time.   ",
  1557.         "                                     ",
  1558.         "                                     ",
  1559.         "< press button or key for main menu >",
  1560.  
  1561.         "If you need  to see the  complete set",    /* window 7 */
  1562.         "of  instructions,  return to the main",
  1563.         "menu  and  select  'Instructions  for",
  1564.         "Play'.  However, when you do this you",
  1565.         "will lose  any progress  you may have",
  1566.         "made in the present game.            ",
  1567.         "                                     ",
  1568.       "                                     ",
  1569.         "< press button or key for main menu >",
  1570. };
  1571.     windesc *instr_win;
  1572.     int i;
  1573.  
  1574.     if (MousePresent) mouse_off(1);
  1575.  
  1576.     instr_win = draw_win(18,CTRWIN,39,11,"INSTRUCTIONS",popup,&defcolors);
  1577.     slct_win(instr_win);
  1578.  
  1579.     if (select == 1) {
  1580.         for (i=1; i<=9; i++)
  1581.             prtfstr(1,i,instr_entries[i],instr_win->wc.text_color,80);
  1582.         while ( !mouse_trigger(1) );
  1583.  
  1584.         for (i=10; i<=18; i++)
  1585.             prtfstr(1,i-9,instr_entries[i],instr_win->wc.text_color,80);
  1586.         while ( !mouse_trigger(1) );
  1587.     }
  1588.     else if (select == 2) {
  1589.         for (i=19; i<=27; i++)
  1590.             prtfstr(1,i-18,instr_entries[i],instr_win->wc.text_color,80);
  1591.         while ( !mouse_trigger(1) );
  1592.  
  1593.         for (i=28; i<=36; i++)
  1594.             prtfstr(1,i-27,instr_entries[i],instr_win->wc.text_color,80);
  1595.         while ( !mouse_trigger(1) );
  1596.  
  1597.         for (i=37; i<=45; i++)
  1598.             prtfstr(1,i-36,instr_entries[i],instr_win->wc.text_color,80);
  1599.         while ( !mouse_trigger(1) );
  1600.  
  1601.         for (i=46; i<=54; i++)
  1602.             prtfstr(1,i-45,instr_entries[i],instr_win->wc.text_color,80);
  1603.         while ( !mouse_trigger(1) );
  1604.     }
  1605.     else if (select == 3) {
  1606.         for (i=55; i<=63; i++)
  1607.             prtfstr(1,i-54,instr_entries[i],instr_win->wc.text_color,80);
  1608.         while ( !mouse_trigger(1) );
  1609.     }
  1610.  
  1611.     if (MousePresent) mouse_on(1);
  1612.     rmv_win(instr_win);
  1613. }
  1614.  
  1615. void    Quit(void)
  1616. {
  1617.     if (MousePresent) mouse_reset();
  1618.     textmode(initial_info.currmode);
  1619.     gotoxy(1,1);
  1620.     TurnBorderOff();
  1621.     TurnCursorOn();
  1622.     clrscr();
  1623.     exit(0);
  1624. }
  1625.  
  1626. void    BeepHi(void)
  1627. {
  1628.     if (SoundToggle)
  1629.     {
  1630.         sound(660);
  1631.         delay(100);
  1632.         nosound();
  1633.         delay(100);
  1634.     }
  1635. }
  1636.  
  1637. void    BeepLo(void)
  1638. {
  1639.     if (SoundToggle)
  1640.     {
  1641.             sound(220);
  1642.             delay(300);
  1643.             nosound();
  1644.             delay(100);
  1645.     }
  1646. }
  1647.  
  1648. void    RunMasterMind(void)
  1649. {
  1650.     int    Temp;
  1651.     do
  1652.     {
  1653.         GoForever = FALSE;
  1654.         UWin = ULose = RestartFlag = HasCheated = FALSE;
  1655.         PegNumber = 0;
  1656.         PegPosition = 1;
  1657.         for (i = 0 ; i <= 4 ; i++) PegGuess[i] = 0;
  1658.         RandomPattern(mode);
  1659.         DrawNewIndicator(mode);
  1660.         if (MousePresent) mouse_on(1); else mouse_off(1);
  1661.  
  1662.         do
  1663.         {
  1664.             if (button_press(LEFT) || kbhit()) {
  1665.             /* see if keyboard is being used and if key is a functionkey */
  1666.                 if (kbhit()) {
  1667.                     ch = toupper(getch()); MouseValid = FALSE; UseKbd = TRUE;
  1668.                     if (ch == NUL) {        /* it must be a function key */
  1669.                         ch = getch();
  1670.                         FunctionKey = TRUE;
  1671.                     }
  1672.                     else FunctionKey = FALSE;
  1673.                 }
  1674.                 else { ch = ' '; MouseValid = TRUE;    }
  1675.  
  1676.                 if (!FunctionKey && ((ch >= 48) && (ch <= 98))
  1677.                     || (MouseValid && mouse_in_box(0,
  1678.                             PegCoords[0],PegCoords[1],
  1679.                             PegCoords[2],PegCoords[3]))) {
  1680.                                 Temp = GetPegType(mode, ch);
  1681.                                 if (Temp != 0) {
  1682.                                     PegNumber = Temp;
  1683.                                     if ((ch >= 48)&&(ch <= 98)) PutPegType(mode);
  1684.                                 }
  1685.                 }
  1686.  
  1687.                 else if ((FunctionKey && ch == 75) || (FunctionKey && ch == 77))
  1688.                             SetPegPosition(mode);
  1689.  
  1690.                 else if  (MouseValid && mouse_in_box(0,
  1691.                             PutCoords[0],PutCoords[1],
  1692.                             PutCoords[2],PutCoords[3]))
  1693.                             if (PegNumber != 0) PutPegType(mode);
  1694.                             else if (HelpOn) {
  1695.                                 if (PegNumber == 0) GiveHelpInformation(1);
  1696.                                 else if (PegGuess[0] != 0 && PegGuess[1] != 0
  1697.                                     && PegGuess[2] != 0 && PegGuess[3] != 0)
  1698.                                             GiveHelpInformation(2);
  1699.                                 else GiveHelpInformation(3); }
  1700.                             else BeepHi();
  1701.  
  1702.                 else if (ch == RTN || (MouseValid && mouse_in_box(0,
  1703.                             MakeGuessCoords[0],MakeGuessCoords[1],
  1704.                             MakeGuessCoords[2],MakeGuessCoords[3])))    MakeGuess(mode);
  1705.  
  1706.                 else if ((FunctionKey && ch==F1)||(MouseValid && mouse_in_box(0,
  1707.                             OptionsCoords[0],OptionsCoords[1],
  1708.                             OptionsCoords[2],OptionsCoords[3]))) SettingsMenu();
  1709.  
  1710.                 else if (HelpOn) {
  1711.                     if (PegNumber == 0) GiveHelpInformation(1);
  1712.                     else if (PegGuess[0] != 0 && PegGuess[1] != 0
  1713.                         && PegGuess[2] != 0 && PegGuess[3] != 0)
  1714.                                 GiveHelpInformation(2);
  1715.                     else GiveHelpInformation(3);}
  1716.             }
  1717.             else if (button_press(RIGHT))
  1718.                 if (mouse_in_box(0,    MakeGuessCoords[0],MakeGuessCoords[1],
  1719.                         MakeGuessCoords[2],MakeGuessCoords[3])) MakeGuess(mode);
  1720.                 else SettingsMenu();
  1721.         } while (!RestartFlag);
  1722.     } while (GoForever);
  1723. }
  1724.  
  1725. void    main(void)
  1726. {
  1727.     InitScreenSettings();
  1728.     init_win();
  1729.     SoundToggle = TRUE;
  1730.     Forever = TRUE;
  1731.     InitializeMouse();
  1732.     ShareWareScreen();
  1733.     do {
  1734.         ShowMainMenu = TRUE;
  1735.         Loop = TRUE;
  1736.         while (ShowMainMenu) PrintDirections();
  1737.         NumPegs = NumberOfPegColors(mode);
  1738.         do {
  1739.             Init();
  1740.             RunMasterMind();
  1741.         } while (Loop);
  1742.     } while (Forever);
  1743.     TurnBorderOff();
  1744.     TurnCursorOn();
  1745. }
  1746.